#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'Python的ORM框架'

# 1.导入sqlalchemy，并且初始化DBSession

from sqlalchemy import Column,ForeignKey, String, create_engine
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类
Base = declarative_base()


class User(Base):
    # 表的名字
    __tablename__ = 'user'

    # 表的结构
    id = Column(String(20), primary_key=True)
    name = Column(String(20))

    # 一对多
    books = relationship('Book')

class Book(Base):
    __tablename__ = 'book'

    # 表的结构
    id = Column(String(20),primary_key=True)
    name = Column(String(20))

    # "多"的一方的book是通过外键关联到user表的：
    user_id = Column(String(20),ForeignKey('user.id'))


def insertUser(id, name):
    try:
        # 初始化数据库连接
        # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
        engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
        # 创建DBSession类型：
        DBSession = sessionmaker(bind=engine)

        # 向数据库添加一行记录，可以视为添加一个User对象

        try:
            # 创建session对象：
            session = DBSession()

            # 创建新的User对象：
            new_user = User(id=id, name=name)

            # 添加到session:
            session.add(new_user)
            # 提交即保存到数据库：
            session.commit()
        except Exception as s:
            print(s)
            session.rollback()
        finally:
            # 关闭session:
            session.close()
    except Exception as e:
        print(e)

def insertBook(id,user_id, name):
    try:
        # 初始化数据库连接
        # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
        engine = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')
        # 创建DBSession类型：
        DBSession = sessionmaker(bind=engine)

        # 向数据库添加一行记录，可以视为添加一个User对象

        try:
            # 创建session对象：
            session = DBSession()

            # 创建新的User对象：
            new_book = Book(id=id,user_id=user_id, name=name)

            # 添加到session:
            session.add(new_book)
            # 提交即保存到数据库：
            session.commit()
        except Exception as s:
            print(s)
            session.rollback()
        finally:
            # 关闭session:
            session.close()
    except Exception as e:
        print(e)

def queryUser(id):
    try:
        # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
        engin = create_engine('mysql+mysqlconnector://root:root@localhost:3306/test')

        DBsession = sessionmaker(bind=engin)

        session = DBsession()

        # database的字符集要为utf8，而且数据库排序规则必须是utf8_general_ci【这貌似是mysqlconnector的一个bug】
        # 创建Query查询，filter是where条件，最后调用one()返回唯一行，如果调用all()则返回所有行:
        user = session.query(User).filter(User.id == id).one()

        print(user,user.name,user.books)
    except Exception as e:
        print(e)
    finally:
        session.close


if __name__ == '__main__':
    # pass
    # insertUser('1', '毛毛')
    # insertBook('1','1', '钢铁是怎样练成的')
    # insertBook('2','1', '坏蛋是怎样练成的')
    queryUser(1)
